@p = global [105 x i32] zeroinitializer
@vis = global [105 x i32] zeroinitializer
@.str = constant [4 x i8] c"%d \00", align 1
@.str.1 = constant [2 x i8] c"\0A\00", align 1
@.str.2 = constant [3 x i8] c"%d\00", align 1

declare i32 @printf(ptr, ...) #1
declare i32 @__isoc99_scanf(ptr, ...) #1

define void @Print(i32 %0){
    %2 = alloca i32
    %3 = alloca i32
    store i32 %0,ptr %2;n
    store i32 0,ptr %3;int i = 0
    br label %4
4: ;i<n
    %5 = load i32,ptr %3;i
    %6 = load i32,ptr %2;n
    %7 = icmp slt i32 %5,%6 ;i<n
    br i1 %7,label %8,label %16
8: ;for loop body
    %9 = load i32,ptr %3;i
    %10 = getelementptr [105 x i32],ptr @p,i32 0,i32 %9 ;p[i]
    %11 = load i32,ptr %10 ;p[i]
    %12 = call i32 (ptr, ...)@printf(ptr @.str,i32 %11);printf("%d ",p[i])
    br label %13
13: ;i=i+1
    %14 = load i32,ptr %3;i
    %15 = add i32 %14,1;++i
    store i32 %15,ptr %3
    br label %4
16: ;loop end
    %17 = call i32 (ptr, ...)@printf(ptr @.str.1)
    ret void
}


define void @DFS(i32 %0,i32 %1){;DFS(0,n)
    %3 = alloca i32
    %4 = alloca i32
    %5 = alloca i32
    store i32 %0,ptr %3 ;pos
    store i32 %1,ptr %4 ;n
    %6 = load i32,ptr %3 ;pos
    %7 = load i32,ptr %4 ;n
    %8 = icmp eq i32 %6,%7 ;pos == n
    br i1 %8, label %9, label %11 
    ;if(pos == n)
9:
    %10 = load i32, ptr %4 ;n
    call void @Print(i32 %10) ;Print(n)
    ret void ;return

11:
    store i32 1,ptr %5 ;int i = 1
    br label %12

12:
    %13 = load i32,ptr %5 ;i
    %14 = load i32,ptr %4 ;n
    %15 = icmp sle i32 %13,%14 ;i <= n
    br i1 %15,label %16,label %36 

16:
    %17 = load i32,ptr %5 ;i
    %18 = getelementptr [105 x i32],ptr @vis,i32 0,i32 %17 ;vis[i] addr
    %19 = load i32,ptr %18 ;vis[i]
    %20 = icmp ne i32 %19,0 ;if(vis[i])
    br i1 %20, label %21,label %22
21:;continue
    br label %33
22:
    %23 = load i32,ptr %3 ;pos
    %24 = load i32,ptr %5 ;i
    %25 = getelementptr [105 x i32],ptr @p,i32 0,i32 %23 ;p[pos]
    store i32 %24,ptr %25 ;p[pos] = i
    %26 = load i32,ptr %5 ;i
    %27 = getelementptr [105 x i32],ptr @vis,i32 0,i32 %26 ;vis[i]
    store i32 1,ptr %27 ;vis[i] = 1
    %28 = load i32,ptr %3 ;pos
    %29 = add i32 %28,1 ;pos+1
    %30 = load i32,ptr %4 ;n
    call void @DFS(i32 %29,i32 %30);DFS(pos+1,n)
    %31 = load i32,ptr %5 ;i
    %32 = getelementptr [105 x i32],ptr @vis,i32 0,i32 %31 ;vis[i]
    store i32 0,ptr %32 ;vis[i] = 0
    br label %33
33:
    %34 = load i32,ptr %5 ;i
    %35 = add i32 %34,1 ;++i
    store i32 %35,ptr %5
    br label %12
36:
    ret void
}

define i32 @main(){
    %1 = alloca i32
    %2 = alloca i32
    store i32 0,ptr %1
    store i32 0,ptr %2;int n = 0
    %3 = call i32 (ptr, ...) @__isoc99_scanf(ptr @.str.2, ptr %2) ;scanf("%d",&n)
    %4 = load i32,ptr %2
    call void @DFS(i32 0,i32 %4) ;DFS(0,n)
    ret i32 0 ;return 0
}
